//
//  WeatherManager.swift
//  天气
//
//  Created by 邢胡斯盛 on 2024/10/10.
//

import UIKit
import CoreLocation

/*
 WeatherManagerDelegate协议
 将自己设置为WeatherManager的代理的类需要实现以下的函数
 */
protocol WeatherManagerDelegate {
    // 用于显示实时天气信息的函数
    func didUpdateWeather(weatherInfo: WeatherModel)
    // 用于处理错误的函数
    func didFailWithWeather(error: Error)
}

/*
 WeatherManager结构体
 用于获取指定城市的天气信息
 */
struct WeatherManager {
    // 用于获取天气信息的初始URL
    let weatherURL: String = "https://api.openweathermap.org/data/2.5/weather?appid=113d632370c4fd35a64c47b47847e69d&units=metric"
    // 用于记录当前结构体的代理
    var delegate: WeatherManagerDelegate?
    
    // 用于获取指定城市的天气信息的函数
    func fetchWeather(cityName: String) {
        let URLString: String = "\(weatherURL)&q=\(cityName)"
        // 从网络中获取实时天气信息
        performRequest(URLString: URLString)
    }
    
    // 用于获取某经纬度的城市的天气信息的函数
    func fetchWeather(latitude: CLLocationDegrees, longitude: CLLocationDegrees) {
        let URLString: String = "\(weatherURL)&lat=\(latitude)&lon=\(longitude)"
        // 从网络中获取实时天气信息
        performRequest(URLString: URLString)
    }
    
    // 用于从网络中获取实时天气信息的函数
    func performRequest(URLString: String) {
        // 创建URL
        if let URL = URL(string: URLString) {
            // 创建URL会话
            let session = URLSession(configuration: .default)
            // 给URL会话一个数据获取的任务（也就是获取实时天气信息）
            let task = session.dataTask(with: URL, completionHandler: handleData(data:response:error:))
            // 开始实时天气信息的获取任务
            task.resume()
        }
    }
    
    // 处理从网络中获取到的实时天气信息的函数
    func handleData(data: Data?, response: URLResponse?, error: Error?) {
        // 获取信息失败的处理
        if error != nil {
            // 让代理类处理错误
            delegate?.didFailWithWeather(error: error!)
            return
        }
        
        // 解析获取到的信息
        if let safeData = data {
            // 解析获取到的实时天气数据
            if let weatherInfo = parseJSON(weatherData: safeData) {
                // 让代理类显示获取到的实时天气信息
                delegate?.didUpdateWeather(weatherInfo: weatherInfo)
            }
            return
        }
    }
    
    // 用于解析JSON数据的函数
    func parseJSON(weatherData: Data) -> WeatherModel? {
        // 解析JSON数据
        let decoder = JSONDecoder()
        do {
            // 将获取到的实时天气JSON数据解析到WeatherData结构体中
            let decodedData = try decoder.decode(WeatherData.self, from: weatherData)
            // 从WeatherData结构体中获取需要显示的信息
            let conditionID: Int = decodedData.weather[0].id
            let temperature: Float = decodedData.main.temp
            let cityName: String = decodedData.name
            let weatherDescription: String = decodedData.weather[0].description
            // 构建并返回WeatherModel
            return WeatherModel(conditionID: conditionID, temperature: temperature, cityName: cityName, weatherDescription: weatherDescription)
        } catch {
            // 让代理类处理错误
            delegate?.didFailWithWeather(error: error)
            return nil
        }
    }
}
